package com.administrator.scoreManageSys.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

import static com.administrator.scoreManageSys.system.SystemConstant.SYSTEM_USER_MENU;
import static com.administrator.scoreManageSys.system.SystemConstant.SYSTEM_USER_ROLE;

/**
 * redis工具类
 *
 * @author Administrator
 */
@Component
public class RedisUtils {
    @Resource
    private RedisTemplate redisTemplate;

    private final String TOKEN = "TOKEN:";

    /**
     * 存入用户登录信息token 设置过期时间 String 类型
     *
     * @param userid   用户id
     * @param value    登录生成的token
     * @param duration 过期时间单位毫秒
     */
    public void loginInformationToken(Long userid, String value, Long duration) {
        String key = TOKEN + userid;
        redisTemplate.opsForValue().set(key, value);
        redisTemplate.expire(key, duration, TimeUnit.MILLISECONDS);
    }

    /**
     * 登出 删除用户token
     *
     * @param userid 用户id
     */
    public void deleteAssignValue(Long userid) {
        String key = TOKEN + userid;
        redisTemplate.delete(key);
    }

    /**
     * 查询用户是否存在 String 类型
     *
     * @param userid 用户id
     * @return 存在/不存在 ture/false
     */
    public Boolean userDoesItExist(Long userid) {
        String key = TOKEN + userid;
        return redisTemplate.hasKey(key);
    }

    /**
     * 更新key的过期时间 String 类型
     *
     * @param userid   用户id
     * @param duration 更新时间
     */
    public void updateKeyTime(Long userid, Long duration) {
        String key = TOKEN + userid;
        redisTemplate.expire(key, duration, TimeUnit.MILLISECONDS);
    }

    /**
     * 获取Key的值 String 类型
     *
     * @param userid 用户id
     */
    public String getToken(Long userid) {
        String key = TOKEN + userid;
        return Objects.requireNonNull(redisTemplate.opsForValue().get(key)).toString();
    }

    /**
     * 获取角色对应权限
     *
     * @param roleId 权限id
     */
    public JSONObject getRoles(Long roleId) {
        //redis hash 支持
        HashOperations<String, String, String> ho = redisTemplate.opsForHash();
        //从redis中获取角色的相关权限
        return JSON.parseObject(JSON.toJSONString(ho.get(SYSTEM_USER_ROLE, roleId)));
    }

    /**
     * 项目启动时 吧权限菜单存入redis中
     *
     * @param systemUserRole 用户角色系统配置名
     * @param id             角色id
     * @param roleJson       权限json
     */
    public void installCompetenceRedis(String systemUserRole, Long id, JSONObject roleJson) {
        HashOperations<String, Long, JSONObject> hashOperations = redisTemplate.opsForHash();
        hashOperations.put(systemUserRole, id, roleJson);
    }

    /**
     * 获取角色对应菜单
     *
     * @param roleId 权限id
     */
    public JSONObject getMenu(Long roleId) {
        //redis hash 支持
        HashOperations<String, String, String> ho = redisTemplate.opsForHash();
        //从redis中获取角色的相关权限
        return JSON.parseObject(JSON.toJSONString(ho.get(SYSTEM_USER_ROLE, roleId)));
    }
}
